home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
cdc
/
src
/
cdrc_.c
< prev
next >
Wrap
Text File
|
1997-03-29
|
40KB
|
1,780 lines
#define TrkMax 1024
#define PrgMax 256
#include "_TNB.c"
#define UNchar unsigned char
#define UNint unsigned int
extern int SCSI_ID;
extern int SCSI_IDF;
extern short SCSI_LUN__;
extern char SCSI_LUN;
extern short LUN_MAX;
extern short PLAYSCSTS; // 1;STSIN待ち 0;待たず
extern short LEDVMOD;
extern short AutoMode; // 0:ノーマル 1:オート(含loop)
extern short RndMode; // 0:ノーマル 1:ランダム
extern short ReptMode; // 0:ノーマル 1:リピート
extern short MemMode; // 0:ノーマル 1:メモリー
extern short Fadeouting; // 0:ノーマル 1:フェードアウト中
extern short FadeoutVol; // フェードアウト中のボリューム
extern short FadeoutDec; // フェードアウト中の減り値
extern short MemLong; // メモリながさ 0以外ならMEMORY
extern short MemPt; // メモリポインタ
extern UNchar MemSock[]; // メモリ
extern short RndLong; // ランダムテーブルながさ 0以外ならMEMORY
extern short RndPt; // ランダムポインタ
extern UNchar RndSock[]; // ランダムテーブル
extern short TrkNo; // 演奏中 トラックナンバー/メモリポインタ
extern short TrkNoS; // 演奏中 トラックナンバー/メモリポインタ
extern short PauseMode; // 0:特に 1:ポーズ中
extern short ExTrak; // 1;拡張トラックあり
extern short CeTrak; // 1;拡張トラックあり
extern short OvTrak; // 1;トラックが足りなかった
extern short DtTrak; // 1;データトラック有り
extern short MD_SeqSecTrak; // 1;MD セパレートトラック有り
extern short MD_MonoTrak; // -1;MONOトラックのみ,1;有り(禁止),0;なし
extern short MD_PlayOnly; // 0;録再MEDIA 1;再生専用MEDIA
extern short Volum; // ボリューム
extern short MastVol; // マスターボリューム
extern char LEDBUF[10][16]; //テキスト表示用のパターンバンク
extern char NAMEBUF[40][16];//表示幅は 36
extern char CHARBUF[40]; //LEDに表示されている文字列
extern short CDIN; //0:CDは入っていない 1:入っている
extern int CdListS; //CDLISTにあるなら 1
extern int CdcTrak; //
extern int CdTrak; //
extern int CdLong; // 長さ
extern UNchar CdName[40]; // CD名
extern char ListName[TrkMax][40]; // 名前
extern int ListLong[TrkMax]; // ながさ時間
extern int ListStTm[TrkMax]; // スタート時間
extern char (*pListName)[][40]; // 名前
extern int (*pListLong)[]; // ながさ時間
extern int (*pListStTm)[]; // スタート時間
extern int O_CdTrak; //
extern int O_ListStTm[100]; // スタート時間
extern int O_ListLong[100]; // ながさ時間
extern UNchar ListTrak[9][100]; //
extern UNchar TitleTy[9];
extern short CddevSw; //0: SCSI直接 1:計測IOCTRL
extern short CddDrvNo; //計測IOCTRL用ドライヴNO
extern short DeviType; //5or4=CD-ROM 0x10=MD
extern int PlayingTimeMD;
extern short JukeBox; // 0:ノーマル 1:JukeBox
extern int cps_ot;
extern UNchar *SetNameAdd;
/********************
常駐部
*********************/
/*------------------------------*/
/* 構造体 */
/*------------------------------*/
typedef struct {
int fg; /* 状態 0x11 演奏中,0x12 演奏中断 */
int track_no; /* 曲番号 */
int time; /* 現在の演奏時間 */
int address; /* 演奏アドレス */
int track_long; /* 演奏中の曲のながさ*/
} PLYINF;
extern PLYINF plyinf;
#define min 1
#define max CdTrak
#define MULU(o1,o2) ( (unsigned short)(o1)*(unsigned short)(o2) )
#define MULS(o1,o2) ( (short)(o1)*(short)(o2) )
#define TIMES(TT) ( __udivsi3( __mulsi3((TT),1000),979) )
#define TIMESR(TT) ( __udivsi3( __mulsi3((TT),979),1000) )
//#define FREMS(TT) ( MULU((TT),4800) / 1024 )
#define FREMS(TT) ( FREMS_TABLE[(TT)] )
#define FREMSR(TT) ( DIVU((TT)*1024+512,4800) )
extern UNchar FREMS_TABLE[16];
extern int CdPlayEndAdds;
extern int CdPlayEndTrak;
static short ChnLunWaiting=-1; //
static short PlayScMd=0; //1;STSIN待ち 0;待たず
static char JkDfPrgTY=0; //Def.Prg.のあるトレイ数
static char JkDfPrgMd=0; // '_<..>' が、1;あった 0;ない
/*----------------------------------------------------------------------------
演奏ルーチン
----------------------------------------------------------------------------*/
/**************************************
演奏する。
[何番演奏する]
start=
Track No
0x100越の場合 MSF指定になる
end=
Track No
-1の場合 max に
0の場合 startのトラックの最後まで指定
0x100越の場合 MSF指定になる
[戻り値] マイナス:エラー
1:MDメディア
2:LUN変更のため 待ち
****************************************/
int CdPlay_hf( int start, int end )
{
PlayScMd=1;
return( CdPlay( start,end ) );
}
/*++++++*/
int CdPlay( int start, int end )
{
int start_address,leadout_address;
int end_address;
int start_track,stop_track;
int i;
int PSM;
leadout_address=CdLong;
CdPlayEndAdds=end;
ChnLunWaiting=-1; //
Fadeouting=0; // 0:ノーマル 1:フェードアウト中
FadeoutVol=Volum; // フェードアウト中のボリューム
CdPlayEndTrak=-1; //演奏止まったらそれで終わり
cps_ot=-1;
PSM=PlayScMd;
PlayScMd=0;
start_track=-1;
if ( O_CdTrak==1 && O_ListStTm[1]<0 ){ //AudioTrack無し
TrkNo=0;
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
return(-2);
}
if ( start<0x100 && (start<min || start>max) ){
TrkNo=0;
StpDsk();
//fprintf_(1,"指定された曲番号は、存在しません。\n");
return(-4);
}
if ( end==0 || end==start ){
CdPlayEndTrak=-1; //演奏止まったらそれで終わり
} else if ( end<0 ){
CdPlayEndTrak=0; //さいごまで
} else if ( end<0x100 ){
CdPlayEndTrak=end;
}
if ( end<0 ){
end = max;
if ( JukeBox!=0 )
end = 0; //Jukeモードなら1曲づつ
if ( MD_SeqSecTrak!=0 )
end = 0; //MD セパレートトラック有りなら1曲ずつ
}
if ( end>0 && end<0x100 && (end<min || end>max) ){
TrkNo=0;
StpDsk();
//fprintf_(1,"指定された曲番号は、存在しません。\n");
return(-4);
}
if ( start<0x100 ){
start_address = (*pListStTm)[start]; // スタート時間
start_track=start;
if ( start_address>=0 ){
;
} else if ( CdPlayEndAdds<0 && start==1 && max!=1 ){
i=CdPlay( 2,-1 ); //MegaD. Towns CD 対策
if ( i==0 ) i=1;
return( i );
} else {
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
return(-2);
}
plyinf.address=start_address; /* 演奏アドレス */
plyinf.track_no=start; /* 曲番号 */
plyinf.time=0; /* 現在の演奏時間 */
} else {
start_track=-1;
start_address = start;
plyinf.address= start;
ChkPlyDispA();
//ChkPlyDispA( &plyinf.fg );
}
if ( end==0 ){
end_address = addtime((*pListStTm)[plyinf.track_no],(*pListLong)[plyinf.track_no]);
end_address = subtime(end_address,1);
stop_track=plyinf.track_no;
} else if ( end<0x100 ){
end_address = addtime((*pListStTm)[end],(*pListLong)[end]);
end_address = subtime(end_address,1);
stop_track=end;
} else {
end_address=end;
stop_track=-1;
}
/* 演奏開始 */
if ( JukeBox!=0 && (start_address&0x10000000)!=0 ){
//LUN変更
// (T00KLLLL_MMMMMMMM_SSSSSSSS_FFFFFFFF)
// ^ロジカル有効フラグ
// ^^^^ ロジカル
i=(start_address/0x01000000)&0xF;
if ( i!=SCSI_LUN__ ){
StpDsk(); // 一応前のトレイの演奏を止める
SetLUN_( i );
//ejeload(); //トレイを出して直ぐ戻す。MBR-7ならいいが・・・
//return(2);
}
}
if ( DeviType==0x10 && MD_MonoTrak!=0 ){ // -1;MONOトラックのみ,1;有り(禁止),0;なし
// MD で、モノラルトラック
start_address = halftime( start_address );
end_address = halftime( end_address );
}
TrkNo=0;
if ( MastVol )
ChnVol(Volum);
if ( DeviType!=0x10 || start_track<0 || ExTrak!=0 ){
if ( PLAYSCSTS==0 || PSM==0 )
i=PlyDsk( start_address, end_address );
else i=PlyDsk_hf( start_address, end_address );
} else {
start_track = start_track - ListTrak[SCSI_LUN__][1] + 1;
stop_track = stop_track - ListTrak[SCSI_LUN__][1] + 1;
if ( PLAYSCSTS==0 || PSM==0 )
i=PlyDskTrack( start_track, stop_track );
else i=PlyDskTrack_hf( start_track, stop_track );
}
if ( i!=0 ){
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
return(-2);
}
plyinf.fg=0x11; /* 状態 0x11 演奏中,0x12 演奏中断 */
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
WaitCC2();
return(0);
}
/**************************************
全曲を演奏する
[戻り値] マイナス:エラー
**************************************/
int CdPlay_all( void )
{
return( CdPlay( 1,-1 ) );
}
/*----------------------------------------------------------------------------
演奏補ルーチン
----------------------------------------------------------------------------*/
/************************************
[UNDO] [R.UP][R.DN]
演奏を再開させる(曲単位)
[引数] 現在からの±No ☆メモリ対応
[戻り値] マイナス:エラー
************************************/
int CdPlay_restart( int no )
{
int i,r;
if ( TrkNo==0 )
return(-1);
if ( RndMode ){
/*ランダムモード*/
if ( no==0 ){
i= TrkNo;
r=CdPlay( i,i );
} else {
if ( ++RndPt>=RndLong ){
i=CdPlay_Rnd2();
r=CdPlay( i,i );
} else {
i=RndSock[RndPt];
r=CdPlay( i,i );
}
if ( r<0 ){
if ( ++RndPt>=RndLong ){
i=CdPlay_Rnd2();
r=CdPlay( i,i );
} else {
i=RndSock[RndPt];
r=CdPlay( i,i );
}
}
MemChkT();
}
return( r );
}
if ( MemLong==0 ){ /*メモリされていない*/
/* 最後まで演奏する */
i= TrkNo + no;
if ( i<min ) i=max;
if ( i>max ) i=min;
if ( ReptMode )
r=CdPlay( i,i );//ランダムならその曲のみ
else r=CdPlay( i,-1 );
if ( r<0 ){
i+=no;
if ( i<min ) i=max;
if ( i>max ) i=min;
if ( ReptMode )
r=CdPlay( i,i );//ランダムならその曲のみ
else r=CdPlay( i,-1 );
}
return( r );
} else {
/*メモリされている*/
if ( no==0 ){
i= TrkNo;
} else {
i=MemPt+no;
if ( i<0 ) i=MemLong-1;
if ( i>=MemLong ) i=0;
MemPt=i;
i=MemSock[i];
}
r=CdPlay( i,i );
return( r );
}
return(-1);
}
/********************************
シーク処理(値を戻すだけ)
[引数] 現在からの巻き戻し(-1)早送り(+1)
[戻り値] 目的MSF
0なら動けない
********************************/
int SeekDisp(int no)
{
extern short TsekSw;
int i,l;
extern int SeekNow; //*
extern short SeekNowTk; //*_SeekNow補佐 trakno
if ( TrkNo==0 || no==0 )
return(0);
if ( SeekNow<0 ){
/* 初めてのコール*/
SeekNow=plyinf.time;
SeekNowTk=plyinf.track_no;
}
if ( TsekSw<30 ) l=22; //0.3秒単位
else if ( TsekSw<60 ) l=37; //0.5秒単位
else l=0x100;//1.0秒単位
if ( no<0 ){
i=SeekNow;
SeekNow=subtime(SeekNow,l);
if ( SeekNow>i || SeekNow<0 )
SeekNow=0;
} else {
if ( SeekNow<=subtime((*pListLong)[SeekNowTk],0x200) )
SeekNow=addtime(SeekNow,l);
else SeekNow=subtime((*pListLong)[SeekNowTk],0x100);
}
return( SeekNow+1 );
}
/*************************************************************
ChkPlyバッファー調整
MD の場合は時間通りならんでいないので、
チェックにもう一ついる・・。
*************************************************************/
void ChkPlyDisp()
{
int i,t,ie;
int ad,ln;
t=(plyinf.track_no&0xFFFF);
ad=plyinf.address;
ie= ListTrak[SCSI_LUN__][t];
if ( JukeBox==0 ){
if ( DeviType!=0x10 ){ //5or4=CD-ROM 0x10=MD
for(i=ie;i<=max;i++){
if ( ad<( (*pListStTm)[i]&0xFFFFFF) )
break;
}
i--;
} else {
for(i=ie;i<=max;i++){
if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
break;
}
if ( i>max ){
i=plyinf.track_no&0xFFFF;
//i=max; こっちのほうがいいかも
}
}
} else {
ln=(SCSI_LUN__)*0x01000000;
if ( DeviType!=0x10 ){ //5or4=CD-ROM 0x10=MD
for(i=ie;i<=max;i++){
if ( ((*pListStTm)[i]&0x0F000000)!=ln )
break;
if ( ad<( (*pListStTm)[i]&0xFFFFFF) )
break;
}
i--;
} else {
for(i=ie;i<=max;i++){
if ( ((*pListStTm)[i]&0x0F000000)!=ln )
break;
if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
break;
}
if ( i>max )
i=plyinf.track_no&0xFFFF;
}
}
plyinf.track_no=i;
plyinf.time=subtime(ad,(*pListStTm)[i]);
}
/*++++++++*/
void ChkPlyDispA() //adのみから計算
{
int i,ie;
int ad,ln;
plyinf.track_no=1;
ChkPlyDisp();
}
/*+++++++++++++++*/
void CPD_MDSUB( PLYINF *pi ) //adのみから計算
{
static UNchar ZenTrk=0;
int i,ie;
int ad,ln;
ad= pi->address;
if ( JukeBox==0 ){
for(i=min;i<=max;i++){
if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
break;
}
if ( i>max ){
//なぜか無かった 前のトラックを使用
i=ZenTrk;
}
} else {
ie= ListTrak[SCSI_LUN__][1];
ln=(SCSI_LUN__)*0x01000000;
for(i=ie;i<=max;i++){
if ( ((*pListStTm)[i]&0x0F000000)!=ln )
break;
if ( ad>=((*pListStTm)[i]&0xFFFFFF) && subtime(ad,(*pListStTm)[i])<((*pListLong)[i]&0xFFFFFF) )
break;
}
if ( i>max ){
//なぜか無かった 前のトラックを使用
i=ZenTrk;
} else {
// 補正
i=i-ie+1;
}
}
// 設定
pi->track_no=i;
ZenTrk=i;
if ( ((*pListLong)[pi->track_no]&0x40000000)==0 ){
pi->time=subtime(ad,(*pListStTm)[i]);
} else {
if ( PlayingTimeMD>=0 ){
i=TIMES(PlayingTimeMD); //補正後のアドレス
// MSF型に変換
pi->time = DIVU(i/0x10,60)*0x10000 + MODU(i/0x10,60)*0x100 + FREMS(i&0xF);
} else {
pi->time=subtime(ad,(*pListStTm)[i]);
}
}
}
/**************************************/
void SetTrkLong()
{
plyinf.track_long=(*pListLong)[TrkNo]; // ながさ時間
}
/*************************************
時間 bcd 同志の引き算 t1-t2
**************************************/
int subtime( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
short t2m,t2s,t2u;
t1m=(t1>>16) & 0xff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u-=t2u)<0 ){
if ( (t1u+=75)<0 )
t1u+=75;
t2s++; //秒のマイナス値を+1
}
if ( (t1s-=t2s)<0 ){
if ( (t1s+=60)<0 )
t1s+=60;
t2m++; //分のマイナス値を+1
}
if ( (t1m-=t2m)<0 ) //ここでマイナス値はおかしいはずなのだ
return( 0 );
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*+++++++++*/
int subtime_( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
short t2m,t2s,t2u;
t1m=(t1>>16) & 0xfff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u-=t2u)<0 ){
if ( (t1u+=75)<0 )
t1u+=75;
t2s++; //秒のマイナス値を+1
}
if ( (t1s-=t2s)<0 ){
if ( (t1s+=60)<0 )
t1s+=60;
t2m++; //分のマイナス値を+1
}
if ( (t1m-=t2m)<0 ) //ここでマイナス値はおかしいはずなのだ
return( 0 );
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*+++++++++*/
int subtime__( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
short t2m,t2s,t2u;
t1m=(t1>>16) & 0xfff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xfff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u-=t2u)<0 ){
if ( (t1u+=75)<0 )
t1u+=75;
t2s++; //秒のマイナス値を+1
}
if ( (t1s-=t2s)<0 ){
if ( (t1s+=60)<0 )
t1s+=60;
t2m++; //分のマイナス値を+1
}
if ( (t1m-=t2m)<0 ) //ここでマイナス値はおかしいはずなのだ
return( 0 );
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*************************************
時間 bcd 同志の足し算 t1+t2
_ ; 100分越対応
**************************************/
int addtime( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
short t2m,t2s,t2u;
t1m=(t1>>16) & 0xff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u+=t2u)>=75 ){
t1u-=75;
t1s++;
}
if ( (t1s+=t2s)>=60 ){
t1s-=60;
t1m++;
}
t1m+=t2m;
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*+++++*/
int addtime_( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
short t2m,t2s,t2u;
t1m=(t1>>16) & 0xfff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u+=t2u)>=75 ){
t1u-=75;
t1s++;
}
if ( (t1s+=t2s)>=60 ){
t1s-=60;
t1m++;
}
t1m+=t2m;
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*************************************
時間 bcd の1/2算 t1/+=2
**************************************/
int halftime( int t1 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
short t1m,t1s,t1u;
t1m=(t1>>16) & 0xff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
if ( t1m&1 )
t1s+=60;
if ( t1s&1 )
t1u+=75;
t1m/=2;
t1s/=2;
t1u/=2;
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*************************************
数値 -> bcd
**************************************/
int tim2msf(s)
int s;
{
int i,j,r;
i=DIVU(s,100*60);
j=MODU(DIVU(s,100),60);
r=MODU(s,100);
r=MULU(r,75); // 1/100s を 1/75s に変換
r=DIVU(r,100);
return( i*0x10000+j*0x100+r );
}
/*************************************
演奏時間の計算
**************************************/
void ProgTimeCalc(st)
int *st;
{
int i;
int s0;
if ( TrkNo==0 ){
st[0]=st[1]=0;
} else if ( ReptMode ){ // 0:ノーマル 1:リピート
st[0]=(*pListLong)[TrkNo]; // 長さ
st[1]=0;
} else if ( RndPt>=0 ){ // ランダムポインタ
s0=0;
for(i=0;i<RndPt;i++)
s0=addtime_(s0,(*pListLong)[RndSock[i]]);
st[1]=s0;
for(;i<RndLong;i++)
s0=addtime_(s0,(*pListLong)[RndSock[i]]);
st[0]=s0;
} else if ( MemPt>=0 ){ // メモリポインタ
s0=0;
for(i=0;i<MemPt;i++)
s0=addtime_(s0,(*pListLong)[MemSock[i]]);
st[1]=s0;
for(;i<MemLong;i++)
s0=addtime_(s0,(*pListLong)[MemSock[i]]);
st[0]=s0;
} else if ( CdPlayEndAdds<0 ){
st[0]=subtime(CdLong,(*pListStTm)[1]); // 長さ
st[1]=subtime((*pListStTm)[TrkNo],(*pListStTm)[1]);
} else {
st[0]=(*pListLong)[TrkNo]; // 長さ
st[1]=0;
}
}
/*----------------------------------------------------------------------------
タイトルルーチン
----------------------------------------------------------------------------*/
/************************************************
引数により名前ポインタアドレス
[戻り値] アドレス
*************************************************/
char *NamePoint(kn,ofs)
int kn,ofs;
{
int i,l;
char *s;
if ( (*pListLong)[kn]>=0 )
return((*pListName)[kn]);
//拡張曲名あり
for(l=CdcTrak-1;l>CdTrak;l--){
i=(*pListLong)[l];
if ( (i&0xFF0000)==0xFF0000 ){
if ( (i&0xFF)==kn )
break;
}
}
if ( l<=CdTrak )
return((*pListName)[kn]); //なぜか無い
s=(*pListName)[kn];
for(;l>CdTrak;l--){
i=(*pListLong)[l];
if ( (i&0xFF0000)!=0xFF0000 )
break;
if ( (i&0xFF)!=kn )
break;
if ( ofs>=((*pListStTm)[l]&0xFFFFFF) )
s=&(*pListName)[l][2];
}
return(s);
}
/*************************************************************
LED表示文字列制作
*************************************************************/
#define jstrlen(SR) \
({ char *st_=(SR); int l_=0,c_; \
while( c_=*(st_++) ){ \
l_++; \
if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ \
l_++; st_++; \
} \
} (l_); \
})
#define jstrlen_(SR) \
({ char *st_=(SR); int l_=0,c_; \
while( c_=*(st_++) ){ \
l_++; \
if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ \
if ( c_>0x80 && c_<0xF0 ) \
l_++; \
st_++; \
} \
} (l_); \
})
/*+++++++++*/
void SetNameLed(na,tt)
UNchar *na;
int tt;
{
int i,l,c,s;
UNchar *ad=(void*)NAMEBUF;
UNchar *ac=(void*)CHARBUF;
i=0;
if ( SetNameAdd==na ) //既に書いた
return;
if ( (tt&0x10000000)!=0 )
s=TitleTy[(tt/0x01000000)&0xF];
else s=CdName[0];
SetNameAdd=na;
if ( s!=' ' ){ // CD名
l=jstrlen(na);
for(;i<(36-l)/2;i++,ad+=16){
SetSp(ad);
*ac++=0x20;
}
}
for(;i<40-1;i++,ad+=16){
c=(*ac++=*na++);
if ( c==0 )
break;
if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
i++;
c=c*0x100+(*ac++=*na++);
if ( SetFont(ad,c)==2 )
ad+=16;
} else {
SetFont1b(ad,c);
}
}
for(;i<40-1;i++,ad+=16)
SetSp(ad);
}
/*----------------------------------------------------------------------------
タイトルリスト解析ルーチン
----------------------------------------------------------------------------*/
static short CL_StTrk,CL_BkTrk,CL_ProgN;
static short CL_OfsTrk;
/*+++++++++++++*/
/************************************************
CDCLISTより、現在のCDちぇっっく
[戻り値] 0 :
-1 : ERR!
*************************************************/
int CdListSub()
{
int l,r;
CdListS=0; //CDLISTにあるなら 1
ExTrak=0;
CeTrak=0;
DtTrak=0;
MD_SeqSecTrak=0; // 1;MD セパレートトラック有り
MD_MonoTrak=0; // -1;MONOトラックのみ,1;有り(禁止),0;なし
MemLong=0; //メモリながさ
CL_OfsTrk=0;
for(l=0;l<100;l++)
O_ListLong[l]=0;
for(l=0;l<CdcTrak;l++){
(*pListLong)[l]=0;
(*pListName)[l][0]=0;
(*pListName)[l][2]=0;
}
r=CdListSub__();
return( r );
}
/*********************
SUB
*********************/
int CdListSub__()
{
int i,l,r;
char tt;
int leadout_address,min_,max_;
int start,end;
int lst[100];
int lstl[100];
CdLong=0; // 長さ
if ( CDROM_chk() ){
if ( CDROM_chk() ){
//fprintf_(1,"SCSI-ID=%2 の装置は、CD-ROM ではないようです。\r\n",SCSI_ID );
return(-100);
}
}
r = RedTOC(&leadout_address,&min_,&max_);
if ( r!=0 )
r = RedTOC(&leadout_address,&min_,&max_);
end = leadout_address;
if ( max_>CdcTrak ) max_=CdcTrak;
/*はじめにチェック*/
O_CdTrak=max_;
CdTrak=max_;
CdName[0]=0;
TitleTy[SCSI_LUN__]=0;
if ( r!=0 ){
//fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
return(-1);
}
CdLong=end; // 長さ
if ( Music_inf_all( min_,max_,&lst,&lstl ) ){
if ( Music_inf_all( min_,max_,&lst,&lstl ) ){
//fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
return(-1);
}
}
tt=0;
for(l=min_;l<=max_;l++){
start=lst[l];
O_ListStTm[l]=start+(SCSI_LUN__*0x01000000+0x10000000);
if ( start<0 )
DtTrak=1; //1;データトラック有り
else tt=1; //1;音楽トラック有り
if ( DeviType!=0x10 ){
if( l==max_ ){
end = subtime( leadout_address,1 );
} else {
end=lst[l+1];
end = subtime( end,1 );
}
i= addtime( subtime( end,start ),1 );
O_ListLong[l]=i; // 長さ
} else {
// MD
end = addtime( start,lstl[l] );
end = subtime( end,1 );
i=lstl[l]; // 長さ
O_ListLong[l]=i; // 長さ
if ( (i&0x40000000)!=0 ) //セパレートセクタフラグ
MD_SeqSecTrak=1; // 1;MD セパレートトラック有り
if ( (i&0x20000000)!=0 ){ //MONOフラグ
if ( MD_MonoTrak==0 )
MD_MonoTrak=-1; // -1;MONOトラックのみ,1;有り(禁止),0;なし
} else {
if ( MD_MonoTrak!=0 )
MD_MonoTrak=1; // -1;MONOトラックのみ,1;有り(禁止),0;なし
}
}
if ( CL_OfsTrk+l<CdcTrak ){
(*pListStTm)[CL_OfsTrk+l]=O_ListStTm[l];
(*pListLong)[CL_OfsTrk+l]=i; // 長さ
(*pListName)[CL_OfsTrk+l][0]=0;
(*pListName)[CL_OfsTrk+l][2]=0;
//if ( DeviType==0x10 )
// GetTrackName( l,(*pListName)[CL_OfsTrk+l] );
}
ListTrak[SCSI_LUN__][l]=l; //
}
if ( tt==0 )
DtTrak=-1; //-1;データのみ
ListTrak[SCSI_LUN__][max_+1]=max_+1; //
O_ListStTm[max_+1]=CdLong;
//(*pListStTm)[max_+1]=CdLong;
SetNameAdd=0;
return(0);
}
/************************************************
CDCLISTより、現在のCDちぇっっく
先にCdListSub()を実行のこと
多連装モード考慮ヶ所
多連装の場合 CdListSub は
[戻り値] 0 : OK、あった 設定した
-1 : ERR! なかった
*************************************************/
int CdListDisp(f)
int f; //ファイルポインタ
{
int l;
CL_StTrk=1;
CL_BkTrk=CdcTrak-1;
CL_ProgN=0;
if ( CdListDisp__(f) ){
NoTtlFile();
return(-1);
}
(*pListStTm)[CdTrak+1]=CdLong;
if ( ExTrak!=0 ){
//拡張トラックがある場合、長さ再計算
for(l=1;l<=CdTrak;l++){
(UNint)(*pListLong)[l]&=(UNint)0xFF000000;
(*pListLong)[l]|=subtime( (*pListStTm)[l+1],(*pListStTm)[l]);
}
}
return(0);
}
/*******************************
[戻り値] 0 : OK、あった 設定した
-1 : ERR! なかった
********************************/
int CdListDisp__(f)
int f; //ファイルポインタ
{
int leadout_address,min_,max_;
int i,j,l;
int ml;
UNchar pf;
char tnum[100];
unsigned char CdLS[9];
unsigned char *s,*d;
int CL_StTrk_=CL_StTrk;
if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
//fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
return(-1);
}
}
if ( max_>CdcTrak ) max_=CdcTrak;
for(i=0;i<100;tnum[i++]=1);
CdTrak=O_CdTrak;
/*--CdLongを文字列化しておく--*/
i=(CdLong>>16)&0xFF,
CdLS[0]='0'+DIVU(i,10);
CdLS[1]='0'+MODU(i,10);
i=(CdLong>> 8)&0xFF,
CdLS[2]='0'+DIVU(i,10);
CdLS[3]='0'+MODU(i,10);
i=(CdLong )&0xFF,
CdLS[4]='0'+DIVU(i,10);
CdLS[5]='0'+MODU(i,10);
/*--ファイルの頭にシーク--*/
FseekTop(f);
FgetsInit(); //READ SUB 初期化
for(;;){
OvTrak=0;
if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1); //ファイルエンド
//fprintf_(1,s);
//fprintf_(1,"\r\n");
//まずは' All ('探し
if ( s[4]!='A' || s[5]!='l' || s[6]!='l' || s[8]!='(')
continue;
if ( s[9]!=CdLS[0] || s[10]!=CdLS[1] || s[12]!=CdLS[2]
|| s[13]!=CdLS[3] || s[15]!=CdLS[4] || s[16]!=CdLS[5] )
continue; //違う
s=&s[17];
for(;*s!=9;s++);
for(;*s==9;s++);
d=CdName;
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
TitleTy[SCSI_LUN__]=CdName[0];
//fprintf_(1,CdName);
//fprintf_(1,"\r\n");
if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1); //ファイルエンド
//1行空のはず
CL_StTrk=CL_StTrk_;
for(l=min_;l<=max_+1;l++,CL_StTrk++){
if ( (int)(s=(UNchar*)Fgets(f))<=0 ) return(-1); //ファイルエンド
//fprintf_(1,s);
//fprintf_(1,"\r\n");
//中間曲名
if ( s[0]==9 && s[1]=='(' && s[2]=='*' && s[3]==')' ){
if ( CL_BkTrk<=CL_StTrk || CL_BkTrk<=max_ ){
OvTrak=1;
l--;
CL_StTrk--;
continue;
//break;
//return(1); //多すぎ
}
l--;
CL_StTrk--;
i=(s[ 4]-'0')*0x10000*10+
(s[ 5]-'0')*0x10000 +
(s[ 7]-'0')*0x100 *10+
(s[ 8]-'0')*0x100 +
(s[10]-'0') *10+
(s[11]-'0');
(UNint)(*pListLong)[CL_StTrk]|=(UNint)0x80000000; //拡張曲名fg
(*pListLong)[CL_BkTrk]=0xFF0000+(CL_StTrk);
(*pListStTm)[CL_BkTrk]=i;
s=&s[12];
for(;*s!=9;s++);
for(;*s==9;s++);
d=(*pListName)[CL_BkTrk];
*d++=0;
*d++=0;
for(i=2;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
CL_BkTrk--;
CeTrak=-1;
continue;
}
//拡張曲名
if ( s[0]==' ' && s[1]=='(' && s[4]==')' && s[5]==' ' ){
if ( CL_BkTrk<=CL_StTrk || CL_BkTrk<=max_ ){
OvTrak=1;
l--;
CL_StTrk--;
continue;
//break;
//return(1); //多すぎ
}
ExTrak=-1;
//CL_StTrk--;
CdTrak++;
l--;
i=(s[ 7]-'0')*0x10000*10+
(s[ 8]-'0')*0x10000 +
(s[10]-'0')*0x100 *10+
(s[11]-'0')*0x100 +
(s[13]-'0') *10+
(s[14]-'0');
//(*pListLong)[CL_StTrk]=O_ListLong[l];
(*pListLong)[CL_StTrk]&=0xFFFFFF; //念のため
(*pListStTm)[CL_StTrk]=(O_ListStTm[l]&0x1F000000)+addtime(O_ListStTm[l],i);
//ListTrak[SCSI_LUN__][l]=CL_StTrk; //
tnum[l]++;
s=&s[15];
for(;*s!=9;s++);
for(;*s==9;s++);
d=(*pListName)[CL_StTrk];
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
continue;
}
if ( l>max_ ){
l++;
break;
}
i=(s[ 7]-'0')*0x10000*10+
(s[ 8]-'0')*0x10000 +
(s[10]-'0')*0x100 *10+
(s[11]-'0')*0x100 +
(s[13]-'0') *10+
(s[14]-'0');
if ( (O_ListLong[l]&0xFFFFFF)!=i )
break; //違う
if ( CL_StTrk<CdcTrak ){
(*pListStTm)[CL_StTrk] = O_ListStTm[l];
(*pListLong)[CL_StTrk] = O_ListLong[l];
(*pListLong)[CL_StTrk]&=0xFFFFFF; //念のため
ListTrak[SCSI_LUN__][l]=CL_StTrk; //
s=&s[15];
for(;*s!=9;s++);
for(;*s==9;s++);
d=(*pListName)[CL_StTrk];
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
}
//fprintf_(1,(*pListName)[CL_StTrk]);
//fprintf_(1,"\r\n");
}
if ( l<=max_+1 )
;
else break;
}
CdListS=1; //CDLISTにあるなら 1
pf=0;
/*プログラムはある?*/
//ここの文字列は既に読んでいる
if ( JukeBox==0 ){ // 0:ノーマル 1:JukeBox
if ( *s++!='\t' )
return(0);
if ( *s=='_' )
s++;
if ( *s++!='<' )
return(0);
} else {
if ( *s++!='\t' )
return(0);
if ( JkDfPrgMd==0 ){ // '_<..>' が、1;あった 0;ない
if ( *s=='_' ){
CL_ProgN=0;
JkDfPrgMd=1; // '_<..>' が、1;あった 0;ない
s++;
}
} else {
if ( *s!='_' )
return(0);
s++;
}
if ( *s++!='<' )
return(0);
}
//ml=MemLong;
for(ml=CL_ProgN;ml<PrgMax;){
for(;*s==' ';s++);
i=c_atoi(s,&j);
s+=j;
if ( i<1 || i>99 )
break;
if ( ml>=PrgMax )
break;
for(;*s==' ';s++);
MemSock[ml]=ListTrak[SCSI_LUN__][i];
pf=1;
if ( *s=='.' ){
s++;
i=c_atoi(s,&j);
s+=j;
if ( i>=0 && i<=99 )
MemSock[ml]+=i;
} else if ( *s=='a' || *s=='A' ){
s++;
for(j=1;j<tnum[i];j++){
if ( (ml+1)>=PrgMax )
break;
MemSock[++ml]=ListTrak[SCSI_LUN__][i]+j;
}
} else if ( *s=='-' ){
s++;
for(;*s==' ';s++);
l=c_atoi(s,&j);
s+=j;
for(i++;i<=l;i++){
if ( i<1 || i>99 )
break;
if ( (ml+1)>=PrgMax )
break;
MemSock[++ml]=ListTrak[SCSI_LUN__][i];
}
}
ml++;
for(;*s==' ';s++);
if ( *s=='>' ) break;
s++;
}
if ( *s=='>' ){
MemLong=ml;
CL_ProgN=ml;
if ( pf!=0 )
JkDfPrgTY++; //Def.Prg.のあるトレイ数
}
return(0);
}
/*****************************************
JukeBox 読み込み
[in] f == 0 ; タイトルリストなし
f != 0 ;ファイルポインタ
*****************************************/
int CdListDispMC(f)
int f; //ファイルポインタ
{
int i,c,s,l;
int ln,cl;
int _CdLong_=0;
int _CdTrak_=0;
int _CL_ProgN_=0;
int _ExTrak_=0;
int tr;
static UNchar ss[8]="JukeBox";
CdListS=0; //CDLISTにあるなら 1
CeTrak=0;
DtTrak=0;
MD_SeqSecTrak=0; // 1;MD セパレートトラック有り
MD_MonoTrak=0; // -1;MONOトラックのみ,1;有り(禁止),0;なし
MemLong=0; //メモリながさ
CL_StTrk=1;
CL_BkTrk=CdcTrak-1;
CL_ProgN=0;
JkDfPrgTY=0; //Def.Prg.のあるトレイ数
JkDfPrgMd=0; // '_<..>' が、1;あった 0;ない
tr=-1;
for(l=0;l<100;l++)
O_ListLong[l]=0;
for(l=0;l<CdcTrak;l++){
(*pListName)[l][0]=0;
(*pListName)[l][2]=0;
(*pListLong)[l]=0;
}
for(ln=0;ln<LUN_MAX;ln++){
ExTrak=0;
SetLUN_(ln);
CL_OfsTrk=CL_StTrk-1;
if ( CdListSub__()!=0 )
continue;
if ( tr<0 )
tr=ln;
c=CdLong;
s=CL_StTrk-1;
_CL_ProgN_=CL_ProgN;
cl=CdListDisp__(f);
if ( cl!=0 ){
/*LISTに無かった*/
for(l=1;l<=CdTrak;l++){
ListTrak[ln][l]=l+s;
(*pListStTm)[CL_StTrk+l-1]=O_ListStTm[l];
(*pListLong)[CL_StTrk+l-1]=O_ListLong[l]&0xFFFFFF; // 長さ
(*pListName)[CL_StTrk+l-1][0]=0;
if ( DeviType==0x10 )
GetTrackName( l,(*pListName)[CL_StTrk+l-1] );
}
CL_StTrk+=CdTrak;
}
if ( _CL_ProgN_==CL_ProgN && cl==0 ){
/*プログラムがなかった*/
if ( JkDfPrgMd==0 ){ // '_<..>' が、1;あった 0;ない
for(l=1;l<=CdTrak;l++){
if ( CL_ProgN<PrgMax ){
if ( (*pListStTm)[l+s]>=0 ) //データトラックは入れない
MemSock[CL_ProgN++]=l+s;
}
}
MemLong=CL_ProgN;
}
}
(*pListStTm)[s+CdTrak+1]=c;
_ExTrak_|=ExTrak;
if ( ExTrak!=0 ){
//拡張トラックがある場合、長さ再計算
for(l=s+1;l<=s+CdTrak;l++){
if ( l<CdcTrak ){
(UNint)(*pListLong)[l]&=(UNint)0xFF000000;
(*pListLong)[l]|=subtime( (*pListStTm)[l+1],(*pListStTm)[l] );
}
}
}
_CdLong_=addtime_(_CdLong_,CdLong);
_CdTrak_+=CdTrak;
}
if ( tr>=0 )
SetLUN_(tr);
else SetLUN_(0);
// 騙し 変数 //
CDIN=1;
if ( _CdTrak_>=CdcTrak )
_CdTrak_=CdcTrak;
CdLong = _CdLong_;
CdTrak = _CdTrak_;
DtTrak = 0;
if ( _ExTrak_!=0 )
ExTrak=-1;
MD_SeqSecTrak=0; // 1;MD セパレートトラック有り
MD_MonoTrak=0; // -1;MONOトラックのみ,1;有り(禁止),0;なし
if ( CdTrak+1<CdcTrak )
(*pListStTm)[CdTrak+1]=CdLong;
for(i=0;i<8;i++)
CdName[i]=ss[i];
O_CdTrak=CdTrak;
O_ListStTm[1]=(*pListStTm)[1];
if ( JkDfPrgTY==0 ){ //Def.Prg.のあるトレイ数
MemLong=0; //メモリながさ
}
return(0);
}
/*****************************
タイトルリストに無し
タイトルリスト無し
*****************************/
void NoTtlFile()
{
int l;
for(l=1;l<=O_CdTrak;l++){
(*pListStTm)[l]=O_ListStTm[l];
(*pListLong)[l]=O_ListLong[l]; // 長さ
ListTrak[SCSI_LUN__][l]=l;
(*pListName)[l][0]=0;
if ( DeviType==0x10 )
GetTrackName( l,(*pListName)[l] );
}
CdName[0]=0;
if ( DeviType==0x10 ){
if ( GetTrackName( 0,CdName ) ){
if ( O_CdTrak==1 && CdLong==0 ){
DtTrak=1; //1;データトラック有り
CdName[0]='M';
CdName[1]='D';
CdName[2]='-';
CdName[3]='D';
CdName[4]='A';
CdName[5]='T';
CdName[6]='A';
CdName[7]=0;
}
}
}
CdTrak=O_CdTrak;
CeTrak=0;
ExTrak=0;
}
/****************************
名前部分を初期化 (いらないルーチン!!?)
*****************************/
void CdNameClr()
{
int l;
CdName[0]=0;
TitleTy[SCSI_LUN__]=0;
for(l=0;l<CdcTrak;l++){
(*pListName)[l][0]=0;
(*pListName)[l][2]=0;
(UNint)(*pListLong)[l]&=(UNint)0x00FFFFFF; //拡張曲名fg 消す
}
SetNameAdd=0;
}
/******************************
文字列を数字に
******************************/
int c_atoi(m,n)
UNchar *m;
int *n;
{
int i=0,j=0;
for(;;){
if ( *m<(UNchar)'0' || *m>(UNchar)'9' )
break;
i=i*10+*m-'0'; j++; m++;
}
*n=j; /*うごいたかず!!*/
return(i);
}
/*----------------------------------------------------------------------------
演奏割り込みルーチン
使用順
----------------------------------------------------------------------------*/
/************************************
BGM
{演奏していないなら演奏}
************************************/
void CdPlay_Bgm()
{
extern int BgmStAdds,BgmEdAdds;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( MastVol==0 || Fadeouting==0 ){ // 0:ノーマル 1:フェードアウト中
if ( TrkNo==0 ){
if ( BgmStAdds<0 ){
FlgClrS();
B_KLE_D2();
return;
}
CdPlay_hf(BgmStAdds,BgmEdAdds);
}
B_KLE_D2();
return;
}
FadeoutDisp();
if ( TrkNo==0 )
FlgClrS();
B_KLE_D2();
return;
}
/************************************
リピート(1P)
{演奏していないなら演奏}
{違うトラックなら演奏}
************************************/
void CdPlay_Rept()
{
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( FadeoutDisp() ){
//B_KLE_D2();
return;
}
if ( TrkNo==0 ){
CdPlay_hf(TrkNoS,TrkNoS);
} else if ( plyinf.track_no!=TrkNoS ){
CdPlay_hf(TrkNoS,TrkNoS);
}
B_KLE_D2();
return;
}
/************************************
ランダム
演奏していないなら演奏
************************************/
void CdPlay_Rnd()
{
int i,j,r;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( FadeoutDisp() ){
//B_KLE_D2();
return;
}
if ( TrkNo!=0 ){ //演奏している
B_KLE_D2();
return;
}
if ( ChnLunWaiting>=0 ){
CdPlay_hf( ChnLunWaiting,0 );
B_KLE_D2();
return;
}
if ( RndPt<0 ){
i=CdPlay_Rnd2();
} else if ( ++RndPt>=RndLong ){
if ( AutoMode==0 ){ // 0:ノーマル 1:オート
TrkNo=0;
TrkNoS=0;
RndPt--; //演奏ストップ
RndMode=0; // 0:ノーマル 1:ランダム
B_KLE_D2();
return;
} else {
i=CdPlay_Rnd2();
}
} else {
i=RndSock[RndPt];
}
if ( NextTrakLun(i) ) return;
CdPlay_hf( i,i );
MemChkT();
B_KLE_D2();
return;
}
/*++++++++++++++*/
int CdPlay_Rnd2() //out 曲ナンバー
{
int i,h,r,l,j;
if ( CDIN==0 )
return(0);
if ( MemLong==0 ){
for(i=0;i<max;i++)
RndSock[i]=i+1; // ランダムテーブル
RndLong=max;
} else {
for(i=0;i<MemLong;i++)
RndSock[i]=MemSock[i]; // ランダムテーブル
RndLong=MemLong;
}
//Randomize(*(short*)(0x09CC));
for(i=0;i<100;i++){
h=MODU(Rand(),RndLong);
l=MODU(Rand(),RndLong);
if ( l==h )
l=MODU(Rand(),RndLong);
j=RndSock[h];
RndSock[h]=RndSock[l];
RndSock[l]=j;
}
if ( TrkNoS==RndSock[0] ){
j=RndSock[0];
RndSock[0]=RndSock[RndLong-1];
RndSock[RndLong-1]=j;
}
RndPt=0;
i=RndSock[RndPt];
return(i);
}
/************************************
メモリー
(メモリー+AUTO)
{演奏していないなら演奏}
************************************/
void CdPlay_Mem()
{
int i,r;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( FadeoutDisp() ){
//B_KLE_D2();
return;
}
if ( TrkNo!=0 ){ //演奏している
B_KLE_D2();
return;
}
if ( ChnLunWaiting>=0 ){
CdPlay_hf( ChnLunWaiting,0 );
B_KLE_D2();
return;
}
if ( AutoMode==0 && TrkNoS==0 ){
B_KLE_D2();
return;
}
if ( ++MemPt>=MemLong ){
if ( AutoMode==0 ){ // 0:ノーマル 1:オート
TrkNo=0;
TrkNoS=0;
MemMode=0; // 0:ノーマル 1:メモリー
MemPt--; //演奏ストップ
B_KLE_D2();
return;
} else {
MemPt=0;
}
}
i=MemSock[MemPt];
if ( NextTrakLun(i) ) return;
CdPlay_hf( i,i );
B_KLE_D2();
return;
}
/*++++++++++++++*/
void MemChkT()
{
int i;
if ( TrkNo==0 ){
MemPt=-1;
return;
}
for(i=0;i<MemLong;i++)
if ( TrkNo==MemSock[i] )
break;
if ( i<MemLong )
MemPt=i;
else MemPt=-1;
}
/************************************
オート[*]
{演奏していないなら演奏}
{TrkNoもちがうなら更新する}
************************************/
void CdPlay_Auto()
{
int i;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( FadeoutDisp() ){
//B_KLE_D2();
return;
}
if ( TrkNo!=0 && plyinf.track_no!=TrkNo ){
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
MemChkT();
}
if ( ChnLunWaiting>=0 ){
CdPlay_hf( ChnLunWaiting,0 );
B_KLE_D2();
return;
}
if ( MemLong!=0 ){
MemMode=-1; // 0:ノーマル 1:メモリー
CdPlay_Mem();
return;
}
if ( TrkNo==0 ){
if ( TrkNoS>=max ){
i=1;
if ( NextTrakLun(i) ) return;
CdPlay_hf(i,-1);
} else {
i=TrkNoS+1;
if ( NextTrakLun(i) ) return;
CdPlay_hf(i,-1);
}
}
B_KLE_D2();
return;
}
/************************************
ノーマルCDチェック
{TrkNoもちがうなら更新する}
************************************/
void CdPlay___()
{
int i;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( FadeoutDisp() ){
//B_KLE_D2();
return;
}
if ( ChnLunWaiting>=0 ){
CdPlay_hf( ChnLunWaiting,0 );
B_KLE_D2();
return;
}
if ( TrkNo==0 ){
if ( TrkNoS==0 ){
;
} else if ( CdPlayEndTrak<0 ){
TrkNoS=0;
//} else if ( JukeBox!=0 && TrkNoS<max ){
} else if ( TrkNoS<max ){
i=TrkNoS+1;
if ( CdPlayEndTrak>0 && TrkNoS>CdPlayEndTrak ){
TrkNoS=0;
B_KLE_D2();
return;
}
if ( NextTrakLun(i) ) return;
CdPlay_hf(i,-1);
} else {
TrkNoS=0;
}
B_KLE_D2();
return;
}
if ( TrkNoS!=0 && plyinf.track_no!=TrkNo ){
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
MemChkT();
}
B_KLE_D2();
return;
}
/*********************************
次の曲のLUNチェック
in tt=トラック
out ; = 0 同じLUN
-1 違うLUN
**********************************/
int NextTrakLun(tt)
int tt;
{
int i,j,l,s;
if ( PLAYSCSTS==0 ){ // 1;STSIN待ち 0;待たず
s = (*pListStTm)[tt]; // スタート時間
//LUN変更
// (T00KLLLL_MMMMMMMM_SSSSSSSS_FFFFFFFF)
// ^ロジカル有効フラグ
// ^^^^ ロジカル
if ( JukeBox==0 || (s&0x10000000)==0 )
return(0);
i=(s/0x01000000)&0xF;
if ( i==SCSI_LUN__ )
return(0);
SetLUN_( i );
ejeload(); //トレイを出して直ぐ戻す。MBR-7ならいいが・・・
WaitCC_100();
ChnLunWaiting=tt;
return(-1);
} else {
return(0);
}
}
/*********************************
フェードアウト
チェック&処理
[戻り値] 0
-1 ; 演奏が終わった。
**********************************/
int FadeoutDisp()
{
if ( TrkNo==0 || MastVol==0 || Fadeouting==0 ) // 0:ノーマル 1:フェードアウト中
return(0);
if ( FadeoutVol>64 ){ // 数値以下ならゆっくりフェードアウト
FadeoutVol-=FadeoutDec;
} else if ( FadeoutVol>24 ){ // 数値以下ならゆっくりフェードアウト
if ( FadeoutDec>2 )
FadeoutVol-=FadeoutDec/2;
else FadeoutVol--;
} else {
if ( FadeoutDec>4 )
FadeoutVol-=FadeoutDec/4;
else FadeoutVol--;
}
if ( FadeoutVol>=0 ){
ChnVol_(FadeoutVol);
return(0);
}
if ( FadeoutVol>-8*2 ){
ChnVol_(0);
return(0);
}
Fadeouting=0; // 0:ノーマル 1:フェードアウト中
TrkNo=0;
if ( DeviType!=0x10 )
StpDsk();
else ZeroUnit();
return(-1);
}